home *** CD-ROM | disk | FTP | other *** search
/ Windows Expert / Windows Expert.iso / windownt / sossnt.zip / SOSSNT / SRC / DTIME.C < prev    next >
C/C++ Source or Header  |  1993-02-28  |  3KB  |  99 lines

  1. /*
  2.  *  dtime.c --
  3.  *      Converts dos to unix time, ie. # of seconds since Jan 1, 1970.
  4.  *
  5.  *  Author: See-Mong Tan
  6.  */
  7.  
  8. #ifdef RCSID
  9. static char _rcsid_ = "$Id: dtime.c_v 1.4 1991/04/11 20:35:05 richb Exp $";
  10. #endif
  11.  
  12. #include "common.h"
  13.  
  14.  
  15. /*
  16.  *  bool_t dtime_init() --
  17.  *      Initialize the time module.  Should be called before any other
  18.  *    routine in this module.  Returns TRUE if no error occurs.
  19.  */
  20. bool_t dtime_init()
  21. {
  22.         if (!getenv ("TZ")) {
  23.         fprintf (stderr, "Timezone not set; SET TZ and try again\n");
  24.         return FALSE;
  25.     }
  26.     _tzset();        /* set global time variables */
  27.  
  28.     DBGPRT2 (nfsdebug, "timezone is GMT-%ld minutes; daylight is %d",
  29.          _timezone / 60, _daylight);
  30.     return TRUE;
  31. }
  32.  
  33. /* cumulative count of the days in a month */
  34. static long dayspermonth[] = {
  35.      0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365,
  36. };
  37.  
  38. /*
  39.  * long unixtime(unsigned time, unsigned date) --
  40.  *      Converts DOS style time and date to UNIX style time, ie. # of
  41.  *    seconds since midnight, Dec 31, 1969.
  42.  */
  43. long unixtime(time, date)
  44.     unsigned time, date;
  45. {
  46.     long t = 0;
  47.     long sec, min, hour, day, month, year;
  48.     
  49.     
  50.     sec = (long) ((time & 0x1f) << 1);
  51.     min = (long) ((time >> 5) & 0x3f);
  52.     hour = (long) ((time >> 11) & 0x1f);
  53.     t = sec + min * 60 + hour * 60 * 60;
  54.  
  55.     day = (long) (date & 0x1f);
  56.     t += (day - 1) * 24 * 60 * 60;            /* day of month */
  57.     /* calculate the month */
  58.     month = (long) ((date >> 5) & 0xf);        /* month field */
  59.     t += dayspermonth[(int) month - 1] * 24 * 60 * 60;
  60.  
  61.     /* calculate the year */
  62.     year = (long) (((date >> 9) & 0x7f) + 1980);    /* year field */
  63.     t += (year - 1970) * 365 * 24 * 60 * 60;
  64.  
  65.     /* now add the number of leap days since 1970 including this */
  66.     t += (long) ((year - 1968) >> 2) * 24 * 60 * 60;
  67.  
  68.     if (year % 4 == 0 && month < 3)            /* this year is leap */
  69.         t -= (long) 24 * 60 * 60;        /* take way 29 feb */
  70.     t += _timezone;        /* take away difference in secs from GMT */
  71.  
  72.     return t;
  73. }
  74.  
  75. /*
  76.  * void dostime(long unixtime, unsigned *time, unsigned *date) --
  77.  *      Converts Unix time (seconds since midnight) into DOS-style
  78.  *      time format.
  79.  *    seconds since midnight, Dec 31, 1969.
  80.  */
  81. void dostime (unixtime, date, time)
  82.      long unixtime;
  83.      unsigned *date, *time;
  84. {
  85.     struct tm *t;
  86.  
  87.     /* convert secs to time struct; adjust for time zone */
  88.     unixtime -= _timezone;
  89.     t = gmtime((time_t *) &unixtime);
  90.     if (t == NULL) {
  91.     *date = 0;
  92.     *time = 0;
  93.     }
  94.     else {
  95.     *date = t->tm_mday + ((t->tm_mon + 1) << 5) + ((t->tm_year - 80) << 9);
  96.     *time = (t->tm_sec >> 1) + (t->tm_min << 5) + (t->tm_hour << 11);
  97.     }
  98. }
  99.